package automaton.rule;

import automaton.view.BooleanMatrix;

/**
 * Regra 1D abstrata, qualquer regra de automato celular 1D deve ser herdada desta.
 * 
 * @author Grupo 6
 *
 */
public abstract class AutomatoCelularRegra {
	
	/**
	 * Cont�m uma referencia para a matriz que contem os automatos na 
	 * evolucao temporal.
	 */
	private BooleanMatrix matrizTemporalAutomatos;
	
	/**
	 * Guarda qual a geracao dos automatos atuais. Comeca na geracao 0, aquela 
	 * com os estados iniciais.
	 */
	private int indiceGeracao;
	
	/**
	 * Para agilizaca do algoritmo, guarda o tamanho do automato com que se 
	 * esta trabalhando
	 */
	private int tamanhoAutomato;
	
	/**
	 * 
	 * @param matrizTemporalAutomatos
	 */
	public AutomatoCelularRegra(BooleanMatrix matrizTemporalAutomatos)
	{
		this.setMatrizTemporalAutomatos(matrizTemporalAutomatos);
		this.setTamanhoAutomato(this.getMatrizTemporalAutomatos().getWidth());
	}
	
	/**
	 * Metodo onde a regra e aplicada efetivamente, deve ser implementado em toda heranca
	 * de regra.
	 */
	abstract public void incrementarGeracao();
	
	/**
	 * O metodo toString deve conter uma retornar um texto descritivo da regra, como "Regra 54"
	 * ou "Regra personalizada com distancia 2 de vizinhanca".
	 */
	abstract public String toString();
	
	// -- Getters e Setters -- // 
	public void setIndiceGeracao(int indiceGeracao) {
		this.indiceGeracao = indiceGeracao;
	}

	public int getIndiceGeracao() {
		return indiceGeracao;
	}

	public void setMatrizTemporalAutomatos(BooleanMatrix matrizTemporalAutomatos) {
		this.matrizTemporalAutomatos = matrizTemporalAutomatos;
	}

	public BooleanMatrix getMatrizTemporalAutomatos() {
		return matrizTemporalAutomatos;
	}

	protected void setTamanhoAutomato(int tamanhoAutomato) {
		this.tamanhoAutomato = tamanhoAutomato;
	}

	protected int getTamanhoAutomato() {
		return tamanhoAutomato;
	}

}
